Software applications use hardware resources such as storage devices which have limited capacities. At the same time, applications often have specific service level expectations which are reliant in part on the resource capacity of the hardware. While some types of hardware resource usage and capacity are easy to measure, determining the storage I/O usage and capacity available to a specific file at a specific point in time is difficult, especially when storage system resources are concurrently shared among several computers and software applications.
For example, the use of storage area networks (SANs) and network attached storage (NAS) that may be shared across multiple computers results in many layers of abstraction between a physical storage device and a logical file. A file may have access to one of several operating system volumes on an operating system disk and each operating system disk may be associated with a storage device logical unit number (LUN) that spans multiple physical storage devices in a storage group within a storage array. One or more of these physical storage devices may furthermore be accessed by an entirely different set of applications through a different computer, logical file, and logical unit number (LUN). It may thus not be possible to view a consolidated end-to-end view of the storage I/O capacity available when accessing the file. Without such an end-to-end view, it is difficult to plan, administer, or automatically adjust the storage I/O capacity to meet the expected level of service of a software application without over or under allocating storage resources.